<?php

namespace com\aristo\ingenieros\model;

include 'com/aristo/ingenieros/view/PersonView.php';
include 'com/aristo/ingenieros/view/PersonEntityView.php';

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

use com\aristo\ingenieros\view\PersonView;
use com\aristo\ingenieros\view\PersonEntityView;
use com\aristo\ingenieros\view\EntityView;
use \Exception;
use \mysqli;

/**
 * Description of PersonQuery
 *
 * @author GINA
 */
class PersonQuery {

    public static function getPersonales($termino, mysqli $con) {
        try {
            $termino = utf8_encode($termino);

            $sql = "SELECT
                        p.idpersona,
                        p.nombres,
                        p.apellido_paterno,
                        p.apellido_materno,
                        tp.descripcion as TIPO,
                        dp.razonsocial
                    FROM
                        persona AS p
                        INNER JOIN detalle_persona AS dp ON p.idpersona = dp.persona_id
                        INNER JOIN tipopersona AS tp ON dp.tipopersona_id = tp.idtipopersona
                    WHERE
                        p.eliminado = 'NO' AND ISNULL(dp.ano_salida) AND (p.nombres LIKE '%" . $termino . "%' OR dp.razonsocial LIKE '%".$termino."%')
                    ORDER BY
                        p.apellido_paterno ASC, p.apellido_materno ASC, p.nombres ASC";

            //$con->autocommit(FALSE);

            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $personales = array();
                    while ($row = $query->fetch_row()) {
                        $idpersona = utf8_decode($row[0]);
                        $nombres = fullUpper(utf8_decode($row[1]));
                        $apellidop = fullUpper(utf8_decode($row[2]));
                        $apellidom = fullUpper(utf8_decode($row[3]));
                        $tipo = utf8_decode($row[4]);
                        $razon = utf8_decode($row[5]);

                        $person = new PersonView();
                        $person->setIdpersona($idpersona);
                        $person->setNombres($nombres);
                        $person->setApellidop($apellidop);
                        $person->setApellidom($apellidom);
                        $person->setApellidos($apellidop . " " . $apellidom);
                        $person->setTipo($tipo);
                        if($tipo != "PROVEEDOR") {
                            $person->setValue(trim($nombres . " " . $apellidop . " " . $apellidom));
                        } else {
                            $person->setValue(trim($razon));
                        }                        
                        $personales [] = $person->toJSON();
                    }
                    return $personales;
                } else {
                    return "NO EXISTE PERSONAS CONFIGURADAS PARA CONTABILIDAD";
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE PERSONAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function getPersonal($id, mysqli $con) {
        try {
            $id = utf8_encode($id);

            $sql = "SELECT
                        p.idpersona,
                        tp.descripcion,
                        p.dni,
                        p.nombres,
                        p.apellido_paterno,
                        p.apellido_materno,
                        p.sexo,
                        p.direccion,
                        dp.correo,
                        dp.ruc,
                        dp.razonsocial
                    FROM
                        persona AS p
                        INNER JOIN detalle_persona AS dp ON p.idpersona = dp.persona_id
                        INNER JOIN tipopersona AS tp ON dp.tipopersona_id = tp.idtipopersona
                    WHERE p.idpersona = " . $id;

            //$con->autocommit(FALSE);

            $query = $con->query($sql);

            if ($query) {
                if ($query->num_rows > 0) {
                    $person = new PersonEntityView();
                    while ($row = $query->fetch_row()) {
                        $id = utf8_decode($row[0]);
                        $tipo = utf8_decode($row[1]);
                        $dni = utf8_decode($row[2]);
                        $nombres = utf8_decode($row[3]);
                        $apellidop = utf8_decode($row[4]);
                        $apellidom = utf8_decode($row[5]);
                        $sexo = utf8_decode($row[6]);
                        $direccion = utf8_decode($row[7]);
                        $correo = utf8_decode($row[8]);
                        $ruc = utf8_decode($row[9]);
                        $razonsocial = utf8_decode($row[10]);

                        $person->setId($id);
                        $person->setTipo($tipo);
                        $person->setDni($dni);
                        $person->setNombres($nombres);
                        $person->setApellidop($apellidop);
                        $person->setApellidom($apellidom);
                        $person->setSexo($sexo);
                        $person->setDireccion($direccion);
                        $person->setCorreo($correo);
                        $person->setRuc($ruc);
                        $person->setRazonsocial($razonsocial);
                    }
                    return $person->toJSON();
                } else {
                    return "PERSONA YA NO EXISTE";
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE PERSONA: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function updatePersonal($id, $tipotrabajador, $dni, $nombres, $apellidop, $apellidom, $sexo, $direccion, $ruc, $razonsocial, $domiciliofiscal, $correo, mysqli $con) {
        try {
            $id = utf8_encode($id);
            $tipotrabajador = utf8_encode($tipotrabajador);
            $dni = utf8_encode($dni);
            $nombres = strtoupper(utf8_encode($nombres));
            $apellidop = strtoupper(utf8_encode($apellidop));
            $apellidom = strtoupper(utf8_encode($apellidom));
            $sexo = utf8_encode($sexo);
            $direccion = utf8_encode($direccion);
            $ruc = utf8_encode($ruc);
            $razonsocial = utf8_encode($razonsocial);
            $domiciliofiscal = utf8_encode($domiciliofiscal);
            $correo = utf8_encode($correo);
            $anio_ingreso = date('Y');

            if ($tipotrabajador == 'p') {
                //nombres apellidop apellidom ruc razonsocial domiciliofiscal;
                $sqlpersona = "UPDATE persona SET
                                nombres = '" . $nombres . "',
                                apellido_paterno = '" . $apellidop . "',
                                apellido_materno = '" . $apellidom . "',
                                direccion = '" . $domiciliofiscal . "'
                            WHERE idpersona = " . $id;

                $sql_detpersona = "UPDATE detalle_persona SET ruc = '" . $ruc . "', razonsocial = '" . $razonsocial . "', correo = '" . $correo . "' WHERE persona_id = " . $id . " AND ano_ingreso = " . $anio_ingreso;
            } else if ($tipotrabajador == 'e' || $tipotrabajador == 'a') {
                //dni nombres apellidop apellidom
                $sqlpersona = "UPDATE persona SET 
                                dni = '" . $dni . "',
                                nombres = '" . $nombres . "',
                                apellido_paterno = '" . $apellidop . "',
                                apellido_materno = '" . $apellidom . "',
                                sexo = '" . $sexo . "' ";
                if ($direccion != "") {
                    $sqlpersona .= ", direccion = '" . $direccion . "' ";
                }
                $sqlpersona .= "WHERE idpersona = " . $id;

                $sql_detpersona = "";
                if ($correo != "") {
                    $sql_detpersona = "UPDATE detalle_persona SET correo = '" . $correo . "' WHERE persona_id = " . $id . " AND ano_ingreso = " . $anio_ingreso;
                }
            }

            $con->autocommit(FALSE);

            $querypers = $con->query($sqlpersona);

            if ($querypers) {
                $querysearch = $con->query("SELECT MAX(ano_ingreso) FROM detalle_persona WHERE persona_id = " . $id);

                if ($querysearch) {
                    $ano_max_ingreso = 0;
                    while ($row = $querysearch->fetch_row()) {
                        $ano_max_ingreso = utf8_decode($row[0]);
                    }
                    $sql_detpersona .= $ano_max_ingreso;

                    if ($tipotrabajador != 'p' && $correo != "") {
                        $querydetpers = $con->query($sql_detpersona);
                    } else {
                        $querydetpers = TRUE;
                    }

                    if ($querydetpers) {
                        $rpta = new EntityView();
                        $rpta->setResponse("SUCCESS");
                        $rpta->setDescripcion("ACTUALIZADO CORRECTAMENTE");
                        return $rpta->toJSON();
                    } else {
                        return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                    }
                } else {
                    return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE PERSONA: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function addPersonal($tipotrabajador, $dni, $nombres, $apellidop, $apellidom, $sexo, $direccion, $ruc, $razonsocial, $domiciliofiscal, $correo, mysqli $con) {
        try {
            $tipotrabajador = utf8_encode($tipotrabajador);
            $dni = ($dni != "") ? utf8_encode($dni) : "NULL";
            $nombres = ($nombres != "") ? strtoupper(utf8_encode($nombres)) : "NULL";
            $apellidop = ($apellidop != "") ? strtoupper(utf8_encode($apellidop)) : "NULL";
            $apellidom = ($apellidom != "") ? strtoupper(utf8_encode($apellidom)) : "NULL";
            $sexo = ($sexo != "") ? utf8_encode($sexo) : "NULL";
            $direccion = ($direccion != "") ? utf8_encode($direccion) : "NULL";
            $ruc = ($ruc != "") ? utf8_encode($ruc) : "NULL";
            $razonsocial = ($razonsocial != "") ? utf8_encode($razonsocial) : "NULL";
            $domiciliofiscal = ($domiciliofiscal != "") ? utf8_encode($domiciliofiscal) : "NULL";
            $correo = utf8_encode($correo);
            $anio_ingreso = date('Y');

            if ($tipotrabajador == 'p') {
                //nombres apellidop apellidom ruc razonsocial domiciliofiscal;
                $sqlpersona = "INSERT INTO persona (idpersona, nombres, apellido_paterno, apellido_materno, direccion) VALUES (NULL, '" . $nombres . "', '" . $apellidop . "', '" . $apellidom . "', '" . $domiciliofiscal . "')";

                $sql_detpersona = "INSERT INTO detalle_persona (ano_ingreso, ruc, razonsocial, correo, persona_id, tipopersona_id) VALUES (" . $anio_ingreso . ", '" . $ruc . "', '" . $razonsocial . "', '" . $correo . "',";
            } else if ($tipotrabajador == 'e' || $tipotrabajador == 'a') {
                //dni nombres apellidop apellidom
                $sqlpersona = "INSERT INTO persona (idpersona, dni, nombres, apellido_paterno, apellido_materno, sexo, direccion) VALUES (NULL, '" . $dni . "', '" . $nombres . "', '" . $apellidop . "', '" . $apellidom . "', '" . $sexo . "', '" . $direccion . "')";

                $sql_detpersona = "INSERT INTO detalle_persona (ano_ingreso, correo, persona_id, tipopersona_id) VALUES (" . $anio_ingreso . ",'" . $correo . "',";
            }
            $tipo = "NULL";
            switch ($tipotrabajador) {
                case 'p': $tipo = "PROVEEDOR";
                    break;
                case 'e': $tipo = "EMPLEADO";
                    break;
                case 'a': $tipo = "ADMINISTRATIVO";
                    break;
                default: break;
            }
            $sql_tipo = "SELECT tp.idtipopersona FROM tipopersona AS tp WHERE tp.descripcion = '" . $tipo . "'";

            $sql_verificar = "SELECT p.idpersona FROM persona AS p WHERE p.dni = '" . $dni . "'";

            $con->autocommit(FALSE);

            $existePersona = $con->query($sql_verificar);

            if ($existePersona) {
                $idpersona = "0";
                while ($row = $existePersona->fetch_row()) {
                    $idpersona = utf8_decode($row[0]);
                }
                if ($idpersona == "0") {
                    $insertPersona = $con->query($sqlpersona);
                    if ($insertPersona) {
                        $idpersona = $con->insert_id;
                    } else {
                        return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                    }
                } else {
                    //dni nombres apellidop apellidom
                    $sqlpersona = "UPDATE persona SET 
                                dni = '" . $dni . "',
                                nombres = '" . $nombres . "',
                                apellido_paterno = '" . $apellidop . "',
                                apellido_materno = '" . $apellidom . "',
                                sexo = '" . $sexo . "' ";
                    if ($direccion != "") {
                        $sqlpersona .= ", direccion = '" . $direccion . "' ";
                    }
                    $sqlpersona .= "WHERE idpersona = " . $idpersona;

                    $querypers = $con->query($sqlpersona);

                    if (!$querypers) {
                        return "NO SE PUDO ACTUALIZAR PERSONA.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                    }
                }

                $selectidtipo = $con->query($sql_tipo);

                if ($selectidtipo) {
                    $idtipo = "0";
                    while ($row = $selectidtipo->fetch_row()) {
                        $idtipo = utf8_decode($row[0]);
                    }
                    if ($idtipo != "0") {
                        $sql_detpersona .= $idpersona . ", " . $idtipo . ")";

                        $insertdetPersona = $con->query($sql_detpersona);
                        //echo $sql_detpersona;
                        if ($insertdetPersona) {
                            $rpta = new EntityView();
                            $rpta->setResponse("SUCCESS");
                            $rpta->setDescripcion("AGREGADO CORRECTAMENTE");
                            return $rpta->toJSON();
                        } else {
                            return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                        }
                    } else {
                        return "ERROR DE CONFIGURACION DE LA TABLA TIPO PERSONA";
                    }
                } else {
                    return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

    public static function deletePersonal($id, $tipotrabajador, mysqli $con) {
        try {
            $id = utf8_encode($id);
            $tipotrabajador = utf8_encode($tipotrabajador);

            $sql_tipo = "SELECT tp.idtipopersona FROM tipopersona AS tp WHERE tp.descripcion = '" . $tipotrabajador . "'";

            $con->autocommit(FALSE);

            $selectidtipo = $con->query($sql_tipo);

            if ($selectidtipo) {
                $idtipo = "0";
                while ($row = $selectidtipo->fetch_row()) {
                    $idtipo = utf8_decode($row[0]);
                }
                $ano_salida = date('Y');
                $sql_detpersona = "UPDATE detalle_persona SET ano_salida = " . $ano_salida . " WHERE persona_id = " . $id . " AND tipopersona_id = " . $idtipo;
                $deletePersona = $con->query($sql_detpersona);
                //echo var_dump($deletePersona).$sql_detpersona;
                if ($deletePersona) {
                    $rpta = new EntityView();
                    $rpta->setResponse("SUCCESS");
                    $rpta->setDescripcion("ELIMINADO CORRECTAMENTE");
                    return $rpta->toJSON();
                } else {
                    return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
                }
            } else {
                return "ERROR DE RED.<br/><br/>Codigo: " . $con->errno . "<br/>" . nl2br($con->error);
            }
        } catch (Exception $exc) {
            return 'ERROR EN EL MODELO DE CUENTAS: ' . $exc->getMessage() . "<br/>" . nl2br($exc->getTraceAsString());
        }
    }

}